/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.tesoreria.bc;

import java.util.Date;
import java.util.List;
import javax.persistence.EntityManager;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.be.Solicitante;
import org.cip.esymons.tesoreria.be.EnumEstadoFraccionamiento;
import org.cip.esymons.tesoreria.be.EnumTipoMoviFraccionamiento;
import org.cip.esymons.tesoreria.be.Fraccionamiento;
import org.cip.esymons.tesoreria.be.MovimientoCuenta;
import org.cip.esymons.tesoreria.be.MovimientoCuota;
import org.cip.esymons.tesoreria.be.MovimientoFraccionamiento;

/**
 *
 * @author Gilmar Montoya
 */
public class FraccionamientoConcreto implements FraccionamientoInterfaz {

    public Fraccionamiento generarCuotas(EntityManager em, List<MovimientoCuenta> listaMovimientos, Solicitante solicitante, List<MovimientoCuenta> listaMovimientosNuevos) {
        Fraccionamiento fraccionamiento = new Fraccionamiento();
        fraccionamiento.setFraFecha(new Date());
        fraccionamiento.setColCodigo(((PersonaNatural) solicitante).getColegiado());
        fraccionamiento.setEstado(EnumEstadoFraccionamiento.Activo);
        fraccionamiento.setFraXtipo("TR");
        em.persist(fraccionamiento);
        operacionesAdicionales(em, fraccionamiento, listaMovimientosNuevos, solicitante);
        return fraccionamiento;
    }

    private void operacionesAdicionales(EntityManager em, Fraccionamiento fraccionamiento, List<MovimientoCuenta> listaMovimientos, Solicitante solicitante) {
        MovimientoFraccionamiento mfra = null;
        double porcentaje = 0.0;
        for (MovimientoCuenta mov : listaMovimientos) {
            em.persist(mov);
            for (MovimientoFraccionamiento movFrac : mov.getListaMovimientosAPagar()) {
                if (mfra == null) {
                    movFrac.setFraccionamiento(fraccionamiento);
                    movFrac.setTipo(EnumTipoMoviFraccionamiento.Deuda);
                    em.persist(movFrac);
                    porcentaje = movFrac.getPorcentaje();
                } else {
                    if (!mfra.getMovimientoCuenta().getMcuCodigo().equals(movFrac.getMovimientoCuenta().getMcuCodigo())) {
                        movFrac.setFraccionamiento(fraccionamiento);
                        movFrac.setTipo(EnumTipoMoviFraccionamiento.Deuda);
                        em.persist(movFrac);
                        porcentaje = movFrac.getPorcentaje();
                    } else {
                        porcentaje = movFrac.getPorcentaje();
                        movFrac = mfra;
                    }
                }
                mfra = movFrac;

                MovimientoCuota mCuota = new MovimientoCuota();
                mCuota.setMfmPorcentaje(porcentaje);
                mCuota.setMovimientoCuenta(mov);
                mCuota.setMovimientoFraccionamiento(movFrac);
                em.persist(mCuota);
            }
        }
    }

    public Double generarInicial() {
        return null;
    }
}
